package BakaNoPackage.Donnees;

import BakaNoPackage.Exception.MangaIntrouvableException;
import BakaNoPackage.Exception.SaisonExistantException;
import BakaNoPackage.Exception.SaisonIntrouvableException;

/**
 * 
 * @author Jonas Renaudot
 * @date 04.12.2008
 *
 *	Symbolise un Manga
 */
public class Manga {
	
	private int id = 0;
	private String nom = null;
	private String commentaire = null;
	private String synopsis = null;
	private java.util.Date date_sortie = null;
	private Integer evaluation = null;
	
	private Donnees donnees = null;
	
	/**
	 * Charge le manga depuis la base de données
	 * @param nom
	 * @param donnees
	 */
	protected Manga(int id, String nom, String commentaire, String synopsis, java.util.Date date_sortie, int evaluation, Donnees donnees){
		
		this.id = id;
		this.nom = nom;
		this.commentaire = commentaire;
		this.synopsis = synopsis;
		this.date_sortie = date_sortie;
		this.evaluation = evaluation;
		
		this.donnees = donnees;
	}
	
	protected Manga(String string){
		this.nom = string;
	}
	
	/**
	 * Recupère une saison du manga
	 * @param nom
	 * @return
	 * @throws SaisonIntrouvableException
	 */
	public Saison getSaison(String nom) throws SaisonIntrouvableException{
		try{
			return donnees.getSaison(id, nom);
		}catch(MangaIntrouvableException e){
			return null;
		}
	}
	
	
	/**
	 * Retourne la liste des saisons du manga
	 * @return toutes les saisons du manga
	 */
	public Saison[] getSaisons(){
		try{
			return donnees.getSaisons(id);
		}catch(MangaIntrouvableException e){
			return null;
		}catch(SaisonIntrouvableException e){
			return null;
		}
	}
	
	/**
	 * Retourne le nom du manga
	 * @return
	 */
	public String getNom(){
		return this.nom;
	}
	
	/**
	 * Définit le nom du manga
	 * @param nom nouveau nom
	 */
	public void setNom(String nom){
		this.nom = nom;
		updateDB();
	}
	
	/**
	 * Retourne le synopsis du manga
	 * @return
	 */
	public String getSynopsis(){
		return this.synopsis;
	}
	
	/**
	 * Définit le synopsis du manga
	 * @param synopsis
	 */
	public void setSynopsis(String synopsis){
		this.synopsis = synopsis;
		updateDB();
	}
	
	/**
	 * Retourne le commentaire du manga
	 * @return
	 */
	public String getCommentaire(){
		return this.commentaire;
	}
	
	/**
	 * Définit le commentaire du manga
	 * @param commentaire
	 */
	public void setCommentaire(String commentaire){
		this.commentaire = commentaire;
		updateDB();
	}
	
	/**
	 * Retourne la date de sortie du manga
	 * @return
	 */
	public java.util.Date getDateSortie(){
		return this.date_sortie;
	}
	
	/**
	 * Définit la date de sortie du manga
	 * @param date
	 */
	public void setDateSortie(java.util.Date date){
		this.date_sortie = date;
		updateDB();
	}
	
	/**
	 * Retourne l'évaluation du manga
	 * @return
	 */
	public int getEvaluation(){
		return evaluation;
	}
	
	/**
	 * Définit l'évaluation du manga
	 * @param evaluation
	 */
	public void setEvaluation(int evaluation){
		this.evaluation = evaluation;
		updateDB();
	}
	
	/**
	 * Retourne l'id du manga
	 * @return
	 */
	public int getID(){
		return this.id;
	}
	
	/**
	 * Créé une saison selon le nom
	 * @param nom
	 * @param donnees
	 * @return
	 */
	public Saison creerSaison(String nom) throws SaisonExistantException{
		//Création du manga dans la base et retour de ce dernier
		return donnees.createSaison(id, nom);
	}
	
	/**
	 * Supprime une saison du manga
	 * @param saison
	 * @throws SaisonIntrouvableException
	 */
	public void delSaison(Saison saison) throws SaisonIntrouvableException{
		//TODO: compléter
		donnees.deleteSaison(saison);
	}
	
	/**
	 * Met à jour les informations vers la base de données
	 */
	private void updateDB(){
		//TODO: compléter
		try{
			this.donnees.setManga(this);
		}catch(Exception e){}
	}
	
	public String toString(){
		String retour = "Manga " + this.getNom();
		retour += "\nDate: "+ this.getDateSortie();
		retour += "\nEvaluation: " + this.getEvaluation();
		retour += "\nCommentaire: " + this.getCommentaire();
		retour += "\nSynopsis: "+this.getSynopsis();
		return retour;
	}
}
